<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
	// "use strict";// 开启严格模式
	// - 关于this
	// >  箭头函数没有自己的this，箭头函数内部的this并不是调用时候指向的对象,而是定义时指向的对象
	{

		// console.log(this);// window
        // var a = 1;
		// console.log(a,window.a,this.a);

        // // 非箭头函数里的this是由调用方决定的，箭头函数中的this是由定义时决定的
        // function fn(){
		// 	console.log(this);
        // }
        // // window.fn();// 相当于 window.fn
        // const obj = {
		// 	fn:function(){
		// 		console.log(this===obj,this);
        //     }
        // }
		// // obj.fn();
		// const fn2 = obj.fn;
		// fn2();

		// console.log(this);
        // const fn = ()=>{
		// 	console.log(this);
        // }
		// fn();
        //
        // const obj = {
		// 	fn:()=>{
		// 		console.log(this);
        //     }
        // }
		// obj.fn();
		// const fn2 = obj.fn;
		// fn2();
    }

	// - 箭头函数不能用于构造函数，也就是不能使用new关键字调用
	{
		// 箭头函数是不允许被实例化的，没有constructor
		// function Box(){
        //
        // }

        // const Box = ()=>{
        //
        // };
		// const obj = new Box();
    }
	// - 箭头函数没有arguments对象
	{
		// const fn =()=>{
		// 	console.log(arguments);
        // }
		// fn(1,2,3,4,5,6)
    }
	// - 箭头函数使用call apply bind
	{
		const obj = {

        }
		// js call apply bind
        function fn(a,b,c,d){
			console.log(a,b,c,d,this===obj);
        }
		const obj2 = {
			fn:function(){
				console.log("obj2->fn",this===obj)
            }
        }
		// bind:作用1：绑定this  作用2：绑定参数 注意：bind不会调用函数
		{
			// bind会返回一个函数
			const fn2 = fn.bind(obj,100,200);
			fn2(300,400);

            // 接收的第一个参数是指定的this
            // fn.bind(obj,100,200)();
        }



		// apply:与call唯一的区别是传递参数的格式不同
        // fn.apply(obj);// 将fn中的this指向为obj
        // fn.apply(obj,[90,80])



		// call
		// fn(1,2);// 1 2 window
        // 可以由第一个参数来指定函数fn内的this指定。
        // 从第二个参数开始才是真正给fn传递的数据
        // fn.call(obj,10,20);
        // obj2.fn();
		// obj2.fn.call(obj);
    }
</script>
</html>